package br.com.alinesoftware.app.controller.jsf.cliente;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.inject.Inject;

import org.apache.log4j.Logger;

import br.com.alinesoftware.app.controller.jsf.AppCreateMB;
import br.com.alinesoftware.app.domain.RedeSocial;
import br.com.alinesoftware.app.entity.CidadeEntity;
import br.com.alinesoftware.app.entity.Cliente;
import br.com.alinesoftware.app.entity.ClienteProprietario;
import br.com.alinesoftware.app.entity.ContaRedeSocial;
import br.com.alinesoftware.app.entity.ContaRedeSocialEntity;
import br.com.alinesoftware.app.entity.EnderecoEntity;
import br.com.alinesoftware.app.entity.Proprietario;
import br.com.alinesoftware.app.entity.ProprietarioEntity;
import br.com.alinesoftware.app.entity.TelefoneEntity;

import com.powerlogic.jcompany.commons.util.cdi.PlcCDIUtil;

public class ClienteCreateMB extends AppCreateMB {

	private static final long serialVersionUID = 133730808754507653L;
	
	@Inject
	protected transient Logger log;

	@Override
	protected boolean newDetailApi(Object detalhe) {
		log.info("Inicializando os objetos agregados");
		inicializarProprietario((ClienteProprietario) detalhe);
		return super.newDetailApi(detalhe);
	}

	private void inicializarProprietario(ClienteProprietario clienteProprietario) {
		// TODO - avaliar porque o cdi nao consegue instanciar esta entidade
		// Cannot resolve an ambiguous dependency between [Managed Bean [class
		// br.com.alinesoftware.app.entity.ProprietarioEntity] with qualifiers
		// [@Any @Default], Producer Method [ProprietarioEntity] with qualifiers
		// [@Any @Default @Named] declared as [[method] @Produces @Named public
		// br.com.alinesoftware.app.controller.jsf.proprietario.ProprietarioMB.criaEntidadePlc()]]
		Proprietario proprietario = new ProprietarioEntity();
		proprietario.setTelefone(new TelefoneEntity());
		proprietario.setContaRedeSocial(new ArrayList<ContaRedeSocial>());

		List<RedeSocial> redes = new ArrayList<RedeSocial>(Arrays.asList(RedeSocial.values()));
		for (RedeSocial redeSocial : redes) {
			ContaRedeSocial contaRedeSocial = PlcCDIUtil.getInstance().getInstanceByType(ContaRedeSocialEntity.class);
			contaRedeSocial.setRedeSocial(redeSocial);
			contaRedeSocial.setPessoa(proprietario);
			proprietario.getContaRedeSocial().add(contaRedeSocial);
		}
		clienteProprietario.setProprietario(proprietario);
	}
	
	@Override
	protected void newEntityAfter() {
		Cliente cliente = (Cliente) getEntity();
		if (cliente.getTelefone() == null) {
			cliente.setTelefone(new TelefoneEntity());			
		}
		if (cliente.getEndereco() == null) {
			cliente.setEndereco(new EnderecoEntity());
			cliente.getEndereco().setCidade(new CidadeEntity());
		}
		super.newEntityAfter();
	}

}
